home *** CD-ROM | disk | FTP | other *** search
- #import "SerialCommDevice.h"
- #import <stdio.h>
- #import <libc.h>
- #import </usr/include/ansi/limits.h>
- /* serialCommDeviceTest
- synopsis: Test program for the SerialCommDevice Class. Transfers random-length records
- containing random binary data.
-
- description: read/write specified serial port.
-
- usage: serialCommDeviceTest {-r|-w} {-a|-b} [-s<n> -l -d]
- -r or -w specifies read or write respectively the specified port.
- -a or -b specifies /dev/ttya or /dev/ttyb port respectively.
- -l specifies loopback mode - read side copies data back to write side.
- -d toggles debug mode.
- -s<n> baud-rate, where n ==1==50baud==min and n==15==38.4Kbaud==max.
- */
-
- #define USE_RANDOM
- // #define TEST_ONLY
- #define BUFFER_SIZE (1024*8)
- #define FIXED_TRANSFER_SIZE 4000 /* must be multiple of ints. */
- #define TRANSFERS 100
- static int debugFlag = 1;
- static id serialDevice = nil;
-
- @interface MySCDDelegate : SCDDelegate
- {
- }
- -oolMessage:(char *)bufr len:(int)l;
- @end
-
- @implementation MySCDDelegate
- -oolMessage:(char *)bufr len:(int)l
- {
- bufr[l] = '\0';
- fprintf(stderr,"\nReceived OOL message:[%s]\n", bufr);
- return self;
- }
- @end
-
- int main(int argc, char **argv)
- {
- int i;
- int arg= 1;
- int retVal = 0;
- int len = 0;
- int loop = 0;
- id sccOOLDelegate = nil;
- int minTransferTime= INT_MAX;
- int maxTransferTime= 0;
- int totalTransferTime= 0;
- int totalTransfers= 0;
- int transferTime= 0;
- int totalCharacters= 0;
- int readFlag = 0;
- int loopBackFlag = 0;
- sccPortType port= sccPortA;
- baudRateType baudRate= brNone;
- char iBuf[BUFFER_SIZE],oBuf[BUFFER_SIZE];
-
- srandom(57);
- while (argc > arg) {
- if (argv[arg][0] == '-') {
- if ((argv[arg][1] == 'r') || (argv[arg][1] == 'R')) {
- readFlag = 1;
- } else if ((argv[arg][1] == 'w') || (argv[arg][1] == 'W')) {
- readFlag = 0;
- } else if ((argv[arg][1] == 'l') || (argv[arg][1] == 'L')) {
- loopBackFlag = 1;
- } else if ((argv[arg][1] == 'a') || (argv[arg][1] == 'A')) {
- port = sccPortA;
- } else if ((argv[arg][1] == 'b') || (argv[arg][1] == 'B')) {
- port = sccPortB;
- } else if ((argv[arg][1] == 'd') || (argv[arg][1] == 'D')) {
- debugFlag = !debugFlag;
- } else if ((argv[arg][1] == 's') || (argv[arg][1] == 'S')) {
- baudRate = atoi(&argv[arg][2]);
- if (baudRate < BR_MIN || baudRate > BR_MAX)
- baudRate = br38400;
- } else {
- fprintf(stderr,"\n%s is an unknown switch.\n",argv[arg]);
- retVal = 1;
- }
- }
- arg++;
- }
-
- if (debugFlag) {
- fprintf(stderr,"\n%sing port %s in %s mode at br:%d using %s transfers\n",readFlag?"Read":"Writ",
- (port==sccPortA)?"A":"B", loopBackFlag?"Loopback":"Normal", baudRate,
- #ifdef USE_RANDOM
- "random"
- #else
- "fixed"
- #endif
- );
- }
-
- if (serialDevice = [[SerialCommDevice alloc] initPort:port atRate:baudRate]) {
- sccOOLDelegate = [[MySCDDelegate alloc] init];
- [serialDevice setDelegate:sccOOLDelegate];
-
- for(loop=0;loop<TRANSFERS;loop++) {
- #ifdef USE_RANDOM
- len = random() % (BUFFER_SIZE/2);
- for (i=0;i<(len/4);i++) {
- *((int *)oBuf+i) = random();
- }
- #else USE_RANDOM
- len = FIXED_TRANSFER_SIZE;
- for (i=0;i<len;i++) {
- oBuf[i] = (char)(' '+((loop+i)&63));
- }
- #endif
- if (debugFlag)
- fprintf(stderr,"\n%sing %d characters...\n",(readFlag)?"Read":"Writ",len);
- if (readFlag) {
- if ((i = [serialDevice recv:iBuf maxLen:BUFFER_SIZE]) != len) {
- if (debugFlag)
- fprintf(stderr,"\nrecv failed - act:%d, exp:%d.\n",i,len);
- retVal = 2;
- break;
- } else if (bcmp(iBuf, oBuf, len)) {
- fprintf(stderr,"\nData Compare Error on loop %d.\n", loop);
- #ifndef USE_RANDOM
- fprintf(stderr,"\nExp:[%s]", oBuf);
- fprintf(stderr,"\nAct:[%s]\n", iBuf);
- #endif
- retVal = 3;
- break;
- } else if (loopBackFlag) {
- if ((transferTime = [serialDevice xmit:iBuf len:len]) < 0) {
- if (debugFlag);
- fprintf(stderr,"\n xmit failed:%d.\n", transferTime);
- retVal = 4;
- break;
- }
- }
- } else { /* write transfer. */
- #ifdef TEST_ONLY
- if ((transferTime = [serialDevice test:oBuf len:len]) < 0) {
- #else TEST_ONLY
- if ((transferTime = [serialDevice xmit:oBuf len:len]) < 0) {
- #endif TEST_ONLY
- if (debugFlag);
- fprintf(stderr,"\n xmit failed:%d.\n",transferTime);
- retVal = 5;
- break;
- #ifndef TEST_ONLY
- } else if (loopBackFlag) {
- if ((i = [serialDevice recv:iBuf maxLen:BUFFER_SIZE]) != len) {
- if (debugFlag);
- fprintf(stderr,"\nrecv failed - act:%d, exp:%d.\n",i, len);
- retVal = 6;
- break;
- }
- #endif
- }
- }
- if (!readFlag || (readFlag && loopBackFlag)) {
- if (debugFlag > 1)
- fprintf(stderr,"\n%d",transferTime);
- totalCharacters += len;
- if (transferTime < minTransferTime)
- minTransferTime = transferTime;
- if (transferTime > maxTransferTime)
- maxTransferTime = transferTime;
- totalTransfers++;
- totalTransferTime += transferTime;
- }
- }
- if (debugFlag && totalTransfers)
- fprintf(stderr, "\n%d characters in %d transfers with minTime=%d us maxTime=%d uSec avgTime=%d uSec "
- "\n%6.1f Sec total transfer time giving %6.1f CPS effective transfer rate.\n",
- totalCharacters, totalTransfers, minTransferTime, maxTransferTime, totalTransferTime/totalTransfers,
- (float)totalTransferTime/1000000.0, (float)totalCharacters/((float)totalTransferTime/1000000.0));
- } else {
- fprintf(stderr,"\ninitPort:atRate: failed.\n");
- retVal = 7;
- }
- return retVal;
- }